package com.airlines.crewassignment.service.crew;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.airlines.crewassignment.domain.*;
import org.joda.time.DateTime;

/**
 * @author xxxx
 * @date 2018年4月4日 
 * @description 飞行员飞行经历服务
 */
public interface CrewFlightExperienceService {
	/**
	 * 根据日期范围，查询飞行员的 历史任务书中的飞行时间  任务书中的空中时间>ACARS滑入-滑出>QAR滑入-滑出
	 * 或者 已经安排了任务但没有飞的飞行时间（待飞）
	 * 
	 * @param dateTimeRange
	 * @parm workcode
	 * @return
	 */
	int  flightDurationSum(DateTimeRange dateTimeRange,String workcode);
	
	
	/**
	 * 查询某个飞行机组人员相关的所有航班，数据来源于任务书以及航班+QAR
	 * 
	 * 
	 * 注意，暂时不取QAR
	 * @param dateTimeRange
	 * @param workcode
	 * @return
	 */
	List<FlightInfo> listFlightInfoForCrew(DateTimeRange dateTimeRange,String workcode,String dutyCode);
		
	/**
	 * 根据航班日期，获取当前月的开始日期和结束日期,注意，结束日期是 beforFlightDate-1 天 
	 * @param beforFlightDate
	 * @return
	 */
	DateTimeRange getFlightDateRangeMonth(Date beforeFlightDate);
	
	/**
	 * 根据航班日期，获取当前年的开始日期和结束日期，,注意，结束日期是 beforFlightDate-1 天 
	 * @param beforFlightDate
	 * @return
	 */
	DateTimeRange getFlightDateRangeYear(Date beforeFlightDate);
	
	/**
	 * 查询所有人员的最后一次所在机场位置，注意 结束日期是 beforFlightDate-1 天 
	 * 最后一次机场的开始时间暂时定前30天，因为再往前，这个就不太准了，不能用于逻辑计算
	 * 如果 有其他的置位问题，均需要在此方法实现
	 * @param beforeFlightDate
	 * @return
	 */
	Map<String,String> listCrewLastAirport(String dutyCode,Date beforeFlightDate);
	
	/**
	 * 根据时间段查询某个人的连线经历
	 * @param dateTimeRange
	 * @param workcode
	 * @return
	 */
	List<LinkLine> listLinkLineBaseForCrew(String dutyCode,DateTimeRange dateTimeRange,String workcode);
	
	/**
	 * 根据日期范围，查询执勤时间
	 * @param dateTimeRange
	 * @param workcode
	 * @return
	 */
	int flightDutyDurationSum(String dutyCode,DateTimeRange dateTimeRange, String workcode);
	
	/**
	 * 查询所有人员的最近一段时间的过夜次数
	 * @param dateTimeRange
	 * @return
	 */
	 Map<String,Integer> listNightPassCount(String dutyCode,DateTimeRange dateTimeRange);
	 
	 
	 /**
	  * 查询所有飞行员的最近一段时间的飞行时间
	  * @param dateTimeRange
	  * @return
	  */
	 Map<String,Integer> listFlightDurationSum(String dutyCode,DateTimeRange dateTimeRange);
	 
	 /**
	  * 查询所有飞行员的最近一段时间的连线航段数超过N次的次数
	  * @param dateTimeRange
	  * @return
	  */
	 Map<String,Integer> listFlightMoreThanCount(String dutyCode,DateTimeRange dateTimeRange);
	 
	 /**
	  * 判断是否是过夜机场
	  * @param airport
	  * @return
	  */
	 boolean airportIsNightPass(String airport);

	/**
	 * 初始化各个飞行员指定日期范围内的每天的执勤期
	 * @param crewList
	 * @param start
	 * @param end
	 */
	void initDutyDurationBeforeDay(String dutyCode,List<Crew> crewList, DateTime start, DateTime end);
	
	/**
	 * 按照日期范围查询所有的人的所有执勤期
	 * @param dateTimeRange
	 * @return
	 */
	Map<String,Integer>  listflightDutyDuration(String dutyCode,DateTimeRange dateTimeRange);
	
	/**
	 * 查询每个机组人员上一次飞行连线信息
	 * @param crewList
	 * @param dutyCode
	 * @param beforeFlightDate
	 * @return
	 */
	Map<String,LinkLine> ListLastLinkLine(String dutyCode, Date beforeFlightDate);

	/**
	 * 夜航次数统计
	 * @param dateTimeRangeYear
	 * @return
	 */
	Map<String, Integer> nightFlyCount(String dutyCode,DateTimeRange dateTimeRange);

	/**
	 * 差航班次数统计
	 * @param dateTimeRangeYear
	 * @return
	 */
	Map<String, Integer> badFlightCount(String dutyCode,DateTimeRange dateTimeRange);

	/**
	 * 初始化飞行员某段时间内的航班经历
	 * @param crewList
	 * @param dutyCode
	 * @param beforeFlightDate
	 */
	void flightInfoListYearInit(List<Crew> crewList, String dutyCode, Date beforeFlightDate);
	

	/**
	 * 查询员工所经历的航班，某一段时间内的航班列表
	 * @param crewFlightInfoList
	 * @param dateTimeRange
	 * @return
	 */
	List<FlightInfo> getFlightInfoListByCrewAndDateTimeRange(List<FlightInfo> crewFlightInfoList,DateTimeRange dateTimeRange);
}
